
public class RemoveOuterParenthesesAlgorithm {

    /**
     * 有效括号字符串为空 ("")、"(" + A + ")" 或 A + B，其中 A 和 B 都是有效的括号字符串，+ 代表字符串的连接。例如，""，"()"，"(())()" 和 "(()(()))" 都是有效的括号字符串。
     * <p>
     * 如果有效字符串 S 非空，且不存在将其拆分为 S = A+B 的方法，我们称其为原语（primitive），其中 A 和 B 都是非空有效括号字符串。
     * <p>
     * 给出一个非空有效字符串 S，考虑将其进行原语化分解，使得：S = P_1 + P_2 + ... + P_k，其中 P_i 是有效括号字符串原语。
     * <p>
     * 对 S 进行原语化分解，删除分解中每个原语字符串的最外层括号，返回 S 。
     * <p>
     *  
     * <p>
     * 示例 1：
     * <p>
     * 输入："(()())(())"
     * 输出："()()()"
     * 解释：
     * 输入字符串为 "(()())(())"，原语化分解得到 "(()())" + "(())"，
     * 删除每个部分中的最外层括号后得到 "()()" + "()" = "()()()"。
     * 示例 2：
     * <p>
     * 输入："(()())(())(()(()))"
     * 输出："()()()()(())"
     * 解释：
     * 输入字符串为 "(()())(())(()(()))"，原语化分解得到 "(()())" + "(())" + "(()(()))"，
     * 删除每隔部分中的最外层括号后得到 "()()" + "()" + "()(())" = "()()()()(())"。
     * 示例 3：
     * <p>
     * 输入："()()"
     * 输出：""
     * 解释：
     * 输入字符串为 "()()"，原语化分解得到 "()" + "()"，
     * 删除每个部分中的最外层括号后得到 "" + "" = ""。
     *  
     * <p>
     * 提示：
     * <p>
     * S.length <= 10000
     * S[i] 为 "(" 或 ")"
     * S 是一个有效括号字符串
     * <p>
     * 来源：力扣（LeetCode）
     * 链接：https://leetcode-cn.com/problems/remove-outermost-parentheses
     * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
     */

    public static void main(String[] args) {
        RemoveOuterParenthesesAlgorithm removeOuterParenthesesAlgorithm = new RemoveOuterParenthesesAlgorithm();
        String outerParentheses = removeOuterParenthesesAlgorithm.removeOuterParentheses("(()())(())");
        System.out.println("输出:" + outerParentheses);
    }

    public String removeOuterParentheses(String S) {
        StringBuilder buffer = new StringBuilder();
        int lastNum = 0;

        for (int i = 2; i <= S.length(); i++) {
            if (i % 2 != 0) {
                continue;
            }
            String substring = S.substring(lastNum, i);
            if (substring.lastIndexOf(")") == substring.length() - 1) {
                int countLeft = getOccur(substring, "(");
                int countRight = getOccur(substring, ")");

                if (countLeft == countRight) {
                    buffer.append(substring, 1, substring.length() - 1);
                    lastNum = i;
                }
            }
        }

        return buffer.toString();
    }


    private int getOccur(String src, String find) {
        int o = 0;
        int index = -1;
        while ((index = src.indexOf(find, index)) > -1) {
            ++index;
            ++o;
        }
        return o;
    }

}
